home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / basic / spllib.zip / PREDITOR.SP < prev    next >
Text File  |  1988-04-06  |  22KB  |  703 lines

  1. BEGIN
  2.      { Preditor : Program editor }
  3.  
  4.      { This program is written in The Structured Programming Language.
  5.      You need to obtain the Structured Programming Language processor
  6.      and process this program with it. A BASIC program will result and
  7.      you will need to sort the program using SORT.EXE and then compile
  8.      the program using any BASIC compiler. This program will run on
  9.      MSDOS, PCDOS, or where there is compiled BASIC, such as on AMIGA,
  10.      MACINTOSH, ATARI ST. You first must translate the program on MSDOS
  11.      or PCDOS. You can obtain the Structured Programming Language from
  12.      PC SIG at 800 245 6717, ask for DISK 666.
  13.      Softdisk at 800 831 2694, ask for BIG BLUE DISK issue #16.
  14.      Public Brand Software at 800 426 3475, ask for DISK BA-9.
  15.      You can also get file SPLLIB.ARC from bbs systems at 800 632 7227,
  16.      516 561 6590, and 516 334 8221. SPL is also known as file SPL.ARC
  17.      and can be gotten from bbs systems at 800 365 6262 and 800 323 7464.
  18.      This program PREDITOR and The Structured Programming Language are
  19.      both shareware. Certainly if you use the SPL processor to create
  20.      a running program out of PREDITOR, then you should register both
  21.      The SPL processor and this program, PREDITOR if you use them and
  22.      like them. If you have questions, call me, Dennis Baer at work at
  23.      516 694 5872. }
  24.  
  25.      INTEGER Found,                 { Sucessful find }
  26.              I,J,                   { Counters }
  27.              Character_pointer,     { Character pointer }
  28.              Result,                { Result }
  29.              File_open,             { File open }
  30.              Current_line,          { Current line in file }
  31.              Output_mode,           { Output mode }
  32.              LE;                    { Logical end of file }
  33.  
  34.      STRING L,                { File record }
  35.             Change_delimiter, { Delimiter used in the change command. }
  36.             Ifile;            { Input file name. }
  37.  
  38.      INTEGER ARRAY PT(4000);  { Record pointers }
  39.  
  40.      STRING ARRAY OF(4000);  { File records }
  41.  
  42.      PROCEDURE INITIALIZE;   { Initialize file arrays, output messages. }
  43.      BEGIN
  44.           OUTPUT('*** PREDITOR version 1.0 ***');
  45.           OUTPUT('    (c) Dennis Baer 1988');
  46.           OPEN('LPT1:' FOR OUTPUT AS #7);  { Open printer }
  47.           File_open := 0;  { File open set to zero, file not open }
  48.           Change_delimiter := '!'; { Set default change delimiter }
  49.           FOR I := 1 STEP 1 UNTIL 4000 DO
  50.           BEGIN
  51.                PT(I) := 0;  { Set pointer to record as null }
  52.                OF(I) := ''; { Set record null }
  53.           END
  54.      END
  55.  
  56.      INTEGER LOW,HIGH,Low_line,High_line; { Line number variables }
  57.  
  58.      PROCEDURE OUTSCREEN(LOW,HIGH);
  59.      BEGIN
  60.           IF HIGH=0 THEN
  61.           BEGIN
  62.                OUTPUT('<' @ LOW @ '>' @ OF(PT(LOW)));
  63.                Current_line := LOW;
  64.                RETURN;
  65.           END
  66.           FOR I:= LOW STEP 1 UNTIL HIGH DO
  67.           BEGIN
  68.                OUTPUT('<' @ I @ '>' @ OF(PT(I)));
  69.           END
  70.           Current_line := HIGH;
  71.      END
  72.  
  73.      PROCEDURE OUTPRINTER(LOW,HIGH);
  74.      BEGIN
  75.           FOR I:= LOW STEP 1 UNTIL HIGH DO
  76.           BEGIN
  77.                L := OF(PT(I));
  78.                OUTPUT(#7, MID$(L,1,80));
  79.                IF LEN(L) > 80 THEN
  80.                BEGIN
  81.                     L := MID$(L,81); OUTPUT(#7,L);
  82.                END
  83.           END  
  84.           Current_line := HIGH; OUTPUT();
  85.      END
  86.  
  87.      STRING Search_string, Replace_string;
  88.  
  89.      PROCEDURE FIND(Search_string);
  90.      BEGIN
  91.           Found := 0;
  92.           FOR J := Current_line STEP 1 UNTIL LE DO
  93.           BEGIN
  94.                Character_pointer := INSTR( OF(PT(J)), Search_string );
  95.                IF Character_pointer <> 0 THEN
  96.                BEGIN
  97.                     Current_line := J;
  98.                     Found := 1; RETURN;
  99.                END
  100.           END
  101.           Current_line := 1;
  102.      END
  103.  
  104.      PROCEDURE CHANGE(Search_string,Replace_string);
  105.      BEGIN
  106.           STRING Part_1, Part_2, Part_3;
  107.  
  108.           Found := 0;
  109.           Character_pointer := INSTR( OF(PT(Current_line)), Search_string );
  110.           IF Character_pointer = 0 THEN RETURN;
  111.           IF Character_pointer = 1 THEN
  112.           BEGIN
  113.                Part_1 := '';
  114.           END
  115.  
  116.           ELSE
  117.           BEGIN
  118.                Part_1 := LEFT$( OF(PT(Current_line)), Character_pointer-1 );
  119.           END
  120.  
  121.           IF ( Character_pointer - 1 + LEN(Search_string) ) >
  122.              LEN(OF(PT(Current_line))) THEN
  123.           BEGIN
  124.                Part_3 := '';
  125.                Part_2 := Replace_string;
  126.                OF(PT(Current_line)) := Part_1 + Part_2 + Part_3;
  127.                Found := 1;
  128.                OUTSCREEN(Current_line,0);
  129.                RETURN;
  130.           END
  131.  
  132.           ELSE
  133.           BEGIN
  134.                Part_3 := MID$( OF(PT(Current_line)), Character_pointer +
  135.                                                      LEN(Search_string) );
  136.                Part_2 := Replace_string;
  137.                OF(PT(Current_line)) := Part_1 + Part_2 + Part_3;
  138.                Found := 1;
  139.                OUTSCREEN(Current_line,0);
  140.                RETURN;
  141.           END
  142.      END
  143.  
  144.      PROCEDURE DELETE_LINES(LOW,HIGH);
  145.      BEGIN
  146.           INTEGER Temp;
  147.  
  148.           Temp := LOW;
  149.           IF HIGH = 0 THEN HIGH := LOW;
  150.           FOR J := LOW STEP 1 UNTIL HIGH DO
  151.           BEGIN
  152.                OF(PT(J)) := ''; PT(J) := 0;
  153.           END
  154.           IF HIGH < LE THEN
  155.           BEGIN
  156.                FOR J := HIGH + 1 STEP 1 UNTIL LE DO
  157.                BEGIN
  158.                     PT(Temp) := PT(J);
  159.                     PT(J) := 0;
  160.                     Temp := Temp + 1;
  161.                END
  162.           END
  163.           Current_line := 1; LE := LE - (HIGH-LOW+1);
  164.      END
  165.  
  166.      STRING Line;
  167.  
  168.      PROCEDURE INPUTLINE(Line);
  169.      BEGIN
  170.           INTEGER Temp;
  171.  
  172.           FOR I := 1 STEP 1 UNTIL 4000 DO
  173.           BEGIN
  174.                IF OF(I) = '' THEN
  175.                BEGIN
  176.                     Temp := I;
  177.                     GO TO Found_blank;
  178.                END
  179.           END
  180.           Found := 0;
  181.           RETURN;
  182.  
  183. Found_blank:
  184.  
  185.           Found := 1;
  186.           IF PT(1) = 0 THEN
  187.           BEGIN
  188.                Current_line := 1; LE := 1; PT(1) := Temp;
  189.                OF(PT(1)) := Line; RETURN;
  190.           END
  191.  
  192.           FOR I := LE + 1 STEP -1 UNTIL Current_line + 2 DO
  193.           BEGIN
  194.                IF LE = Current_line THEN GO TO Done_shifting;
  195.                PT(I) := PT(I-1);
  196.           END
  197.  
  198. Done_shifting:
  199.  
  200.           PT(Current_line + 1) := Temp; LE := LE + 1;
  201.           OF(PT(Current_line + 1)) := Line;
  202.           Current_line := Current_line + 1;
  203.      END
  204.            
  205.      STRING File; { File name of open file. }
  206.  
  207.      PROCEDURE OPENFILE(File);
  208.      BEGIN
  209.           INTEGER Temp;
  210.  
  211.           IF File_open = 1 THEN
  212.           BEGIN
  213.                Result := 0;
  214.                RETURN;
  215.           END
  216.  
  217.           ONERRGOTO File_open_error;
  218.  
  219.           OPEN( File FOR INPUT AS #1 );
  220.  
  221.           ONERRGOTO File_read_error;
  222.  
  223.           FOR I := 1 STEP 1 UNTIL 4000 DO
  224.           BEGIN
  225.                IF EOF(1) THEN GO TO Success; { End of file. }
  226.                LINEIN( #1,L); { Read record. }
  227.                IF L = '' THEN L := ' '; { Null line set to a blank }
  228.                PT(I) := I; OF(I) := L; Temp := I;
  229.           END
  230.  
  231. Success:  CLOSE(#1); Result := 1; File_open := 1; { Set file open. }
  232.           LE := Temp; Current_line := 1;
  233.           RETURN;
  234.  
  235. File_open_error: Result := 0; OUTPUT('*** Error, opening file: ' @ File @
  236.                                     ' ***');
  237.           RESUME Finish_open;
  238.  
  239. File_read_error: Result := 0; OUTPUT('*** Error, reading file: ' @ File @
  240.                                     ' ***');
  241.           RESUME Finish_open;
  242.  
  243. Finish_open:
  244.  
  245.      END
  246.  
  247.      PROCEDURE SAVEFILE(File);  { Save text file. }
  248.      BEGIN
  249.           { If file is not open and no file name is given
  250.             give error code